#include <stdio.h>

// #define M 100
// int main()
// {
//     // 注释......
//     int a = 0;
//     int b = 0;
//     b = M;
//     printf("hello world %d\n", b);
//     return 0;
// }

// test.c    ------------------------------------->     test.exe
// 翻译环境                                              运行环境
// 编译(编译器) vs2019 cl.exe  链接(链接器)link.exe
// 预编译(预处理)     编译     汇编

// clang -E test.c -o test.i  预编译(预处理)指令
// 注释替换成空格，头文件的包含，#define符号的替换
// #include，#define预处理指令，所有预处理指令都在与处理阶段处理

// clang -S test.i -o test.s 把c语言代码翻译成汇编代码
// 词法分析，语法分析，语义分析，符号汇总

// clang -c test.s -o test.o汇编
// 把汇编代码翻译成二进制的指令，生成了.o文件，目标文件
// 生成符号表

// clang test.o -o test 链接
// 生成可执行程序test
// 合并段表，符号表的合并和重定位

// 目标文件都是有格式的
// gcc编译器生成的目标和二进制的可执行文件都是按照elf这种文件的形式组织的
// test.o和add.o相同段落的数据进行和并，形成二进制的可执行文件
// add 0x100       add 0x000(只有声明没有定义，地址无效)  main 0x200
// test.o和add.o有各自的符号表，在形成二进制可执行文件前也进行合并

// int main()
// {
//     printf("%s\n", __FILE__);
//     printf("%d\n", __LINE__);
//     printf("%s\n", __DATE__);
//     printf("%d\n", __STDC__);
//     printf("%s\n", __TIME__);
//     return 0;
// }

#define ADD(x, y) x + y

int main()
{
    int a = 10;
    int b = 20;
    int c = ADD(a, b);
    printf("%d\n", c);
    return 0;
}